const express = require('express');
const router = express.Router();
const config = require('../config/config.js');
const codingURL = config.codingURL;
const ExcelJS = require('exceljs');
const fs = require('fs-extra');
const moment = require('moment');
const axios = require('axios');
const { v4: uuidv4 } = require('uuid');
const log4js = require('log4js');
const logger = log4js.getLogger('local');

// 设置常量
const bakBranchName = 'release-bak-2503.14';

// 生成随机数字字符串
function generateRandomNumber(length) {
    let result = '';
    for (let i = 0; i < length; i++) {
        result += Math.floor(Math.random() * 10);
    }
    return result;
}

// 接口1: /generateExcel
router.post('/generateExcel', async (req, res) => {
    try {
        const fileName = `${config.fileNameStep1}-${moment().format('HH_mm_ss')}.xlsx`;
        const workbook = new ExcelJS.Workbook();
        const worksheet = workbook.addWorksheet('新一代企业网银');

        // 设置表头
        const headers = [
            '需求编号', '子需求编号', '子单编号', '新一代企业网银', '子单名称', 
            '子单状态', '需求提出人', '负责人', '投产日期', '主系统', 
            '需求部门', '投产标志', '需求分析', '功能点数', '只配合测试', 
            '走查风险情况', '是否涉及前台', '是否涉及后台', '是否合并BAK', 
            '涉及菜单功能码', '回退方式'
        ];

        // 添加表头
        worksheet.addRow(headers);

        // 生成10行记录
        for (let i = 0; i < 10; i++) {
            const subReqNumber = i === 2 ? 'BoCom12345678' : `BoCom${generateRandomNumber(8)}`;
            const subOrderNumber = `${subReqNumber}-${generateRandomNumber(1)}`;
            
            const rowData = [
                `REQ-${generateRandomNumber(6)}`, // 需求编号
                subReqNumber, // 子需求编号
                subOrderNumber, // 子单编号
                '新一代企业网银', // 新一代企业网银
                `子单${i + 1}`, // 子单名称
                '进行中', // 子单状态
                `提出人${i + 1}`, // 需求提出人
                `负责人${i + 1}`, // 负责人
                moment().add(i, 'days').format('YYYY-MM-DD'), // 投产日期
                '主系统1', // 主系统
                '需求部门1', // 需求部门
                '是', // 投产标志
                '需求分析内容', // 需求分析
                Math.floor(Math.random() * 10) + 1, // 功能点数
                '否', // 只配合测试
                '低', // 走查风险情况
                Math.random() > 0.5 ? '是' : '否', // 是否涉及前台
                Math.random() > 0.5 ? '是' : '否', // 是否涉及后台
                ['是', '否', '/'][Math.floor(Math.random() * 3)], // 是否合并BAK
                `MENU-${generateRandomNumber(4)}`, // 涉及菜单功能码
                '回退方式1' // 回退方式
            ];
            
            worksheet.addRow(rowData);
        }

        // 设置列宽
        worksheet.columns.forEach(column => {
            column.width = 18;
        });

        // 保存文件
        await workbook.xlsx.writeFile(fileName);
        logger.info(`已生成文件-${fileName}`);

        res.json({ code: 200, message: 'Excel文件生成成功', fileName });
    } catch (error) {
        logger.error('生成Excel文件失败:', error);
        res.status(500).json({ code: 500, message: '生成Excel文件失败', error: error.message });
    }
});

// 接口2: /modifyExcel
router.post('/modifyExcel', async (req, res) => {
    try {
        const fileName = `${config.fileNameStep2}-${moment().format('HH_mm_ss')}.xlsx`;
        
        // 查找符合格式的文件
        const files = fs.readdirSync('.');
        const sourceFilePattern = new RegExp(`${config.fileNameStep1}-\\d{2}_\\d{2}_\\d{2}\\.xlsx`);
        const sourceFile = files.find(file => sourceFilePattern.test(file));
        
        if (!sourceFile) {
            throw new Error('未找到符合条件的源文件');
        }
        
        // 复制文件
        await fs.copy(sourceFile, fileName);
        logger.info(`已生成文件-${fileName}`);
        
        // 获取分支列表
        const branchesResponse = await axios.get(`${codingURL}/api/user/escm/project/nebs/depot/nebs_web/git/list_branches`);
        const branchesList = branchesResponse.data.data.map(item => item.name);
        
        // 打开Excel文件
        const workbook = new ExcelJS.Workbook();
        await workbook.xlsx.readFile(fileName);
        let worksheet = workbook.getWorksheet('新一代企业网银');
        
        if (!worksheet) {
            worksheet = workbook.addWorksheet('新一代企业网银');
        }
        
        // 获取当前列数
        const columnCount = worksheet.columnCount;
        
        // 添加新列
        worksheet.getRow(1).getCell(columnCount + 1).value = '前端是否已合并BAK';
        worksheet.getRow(1).getCell(columnCount + 2).value = '存在的前端分支';
        
        // 处理每一行数据（从第二行开始，第一行是表头）
        for (let i = 2; i <= worksheet.rowCount; i++) {
            const row = worksheet.getRow(i);
            const subReqNumber = row.getCell(2).value; // 子需求编号
            
            // 构建需求分支
            const featureBranch = `feature-${subReqNumber}`;
            
            // 查找匹配的分支
            const matchedBranches = branchesList.filter(branch => 
                branch === featureBranch || branch.startsWith(`${featureBranch}-`)
            );
            
            // 设置存在的前端分支
            const frontendBranchesCell = row.getCell(columnCount + 2);
            if (matchedBranches.length > 0) {
                frontendBranchesCell.value = matchedBranches.join(', ');
            } else {
                frontendBranchesCell.value = `不存在名为${featureBranch}的分支`;
            }
            
            // 设置前端是否已合并BAK
            const mergeStatusCell = row.getCell(columnCount + 1);
            if (matchedBranches.length > 0) {
                const mergeResults = [];
                
                // 为每个匹配的分支检查合并状态
                for (const branch of matchedBranches) {
                    try {
                        const mergeResponse = await axios.get(`${codingURL}/api/user/escm/project/nebs/depot/nebs_web/git/can_merge?source=${branch}&target=${bakBranchName}`);
                        mergeResults.push({
                            name: branch,
                            merge_status: mergeResponse.data.data.merge_status
                        });
                    } catch (error) {
                        mergeResults.push({
                            name: branch,
                            merge_status: 'ERROR'
                        });
                    }
                }
                
                // 格式化JSON并写入单元格
                mergeStatusCell.value = JSON.stringify(mergeResults, null, 2);
            } else {
                mergeStatusCell.value = '/';
            }
        }
        
        // 保存文件
        await workbook.xlsx.writeFile(fileName);
        logger.info(`已修改文件-${fileName}`);
        
        res.json({ code: 200, message: 'Excel文件修改成功', fileName });
    } catch (error) {
        logger.error('修改Excel文件失败:', error);
        res.status(500).json({ code: 500, message: '修改Excel文件失败', error: error.message });
    }
});

module.exports = router;